package demo12

// 模板设计模式
import "fmt"
// 所有模板都用于下载
type Downloader interface{
	// 下载方法
	Download(uri string)
}
// 模板结构体 下载所需
type template struct{
	implement
	uri string
}
// 抽象模板
type implement interface{
	save()
	download()
}

// 模板的方法
func NewTemplate(impl implement) *template{
	return &template{
		implement:impl,
	}
}
// 实现
func (d *template)Download(uri string){
	d.uri = uri
	d.download()
	d.save()
}
// 实现
func (d *template) save(){
	fmt.Println(d.uri)
	fmt.Println("default save")
}
func (*template)download(){
	fmt.Println("default download")
}
// 模板继承
type HTTPDownloadTemplate struct{
	*template
}

func NewHTTPDownloadTemplate() Downloader{
	http := &HTTPDownloadTemplate{}
	temp := NewTemplate(http)
	http.template = temp
	return http
}

func (d *HTTPDownloadTemplate)save(){
	fmt.Println(d.uri)
	fmt.Println("http save")
}

type FTPDownloadTemplate struct{
	*template
}

func NewFTPDownloadTemplate() Downloader{
	ftp := &FTPDownloadTemplate{}
	tmp := NewTemplate(ftp)
	ftp.template = tmp
	return ftp
}